#ifndef _INCLUDE_MQTT_PARAMS_H_
#define _INCLUDE_MQTT_PARAMS_H_

#include "Define.h"
#include "Message.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief publish 参数
 */
typedef struct {
    char*        topic;                      /**发布报文topic*/
    uint8_t*     payload;                    /**发布报文负载*/
    uint32_t     payloadLen;                 /**发布报文负载长度*/
    uint8_t      qos;                        /**发布报文QOS,0或者1*/
    PubProperty* property;                   /**发布报文属性*/
} PublishParams;

/**
 * @brief 订阅参数
 */
typedef struct {
    char*        topic;                         /**订阅topic*/
    uint8_t      qos;                           /**订阅topic期望服务支持的最大QOS值,当前仅支持0和1*/
    void*        context;                       /**用户上下文*/
    SubProperty* property;                      /**订阅报文的属性*/
} SubscribeParams;

typedef struct {
    char*           topic;                      /**取消订阅topic*/
    UnSubProperty*  property;                   /**取消订阅报文的属性*/
} UnSubscribeParams;

typedef struct {
    uint8_t             reason;
    DisconnectProperty* property;                /**断开连接报文属性*/
} DisconnectParams;

/**
 * @brief mqtt 自定义client id
 */
typedef struct {
    char*           extendClientId;             /**连接平台时的扩展ClientId,可自定义*/
} MQTTCustomParams;

/**
 * @brief mqtt 控制参数
 */
typedef struct {
    int8_t          enableFlowCtl;
    int8_t          cleanSession;
    int8_t          appendRequestId;
    int32_t         republishTimeout;
} MQTTControlParams;

/**
 * @brief 日志级别
 */
typedef enum {
    aiotDebug,
    aiotTrace,
    aiotInfo,
    aiotWarning,
    aiotError
} AiotLoggerLevel;

/**
 * @brief 服务平台地址信息
 */
typedef struct {
    char*       host;               /**服务地址*/
    int32_t     port;               /**服务端口*/
} AiotServerAddress;

/**
 * @brief 一机一密三元组信息
 */
typedef struct {
    char*       productKey;         /**产品key*/
    char*       deviceKey;          /**设备key*/
    char*       secretKey;          /**设备秘钥*/
} AiotDeviceInfo;

/**
 * @brief 一型一密三元组信息
 */
typedef struct {
    char*       productKey;         /**产品key*/
    char*       deviceNo;           /**设备序列号*/
    char*       secretKey;          /**产品秘钥*/
} AiotProductInfo;

/**
 * @brief 接入通道参数
 */
typedef struct {
    int32_t     hbInterval;             /**心跳间隔*/
    int32_t     hbMaxLost;              /**心跳丢失最大次数*/
    int8_t      enableReConn;           /**是否允许重连*/
    int32_t     connectTimeout;         /**连接超时时间*/
    int32_t     reConnInterval;         /**重连间隔时间*/
    int32_t     sendDataTimeout;        /**发送数据超时时间*/
    int32_t     recvDataTimeout;        /**接收数据超时时间*/
} AiotChannelParams;

/**
 * @brief 证书选项
 */
typedef enum {
    aiotCredNone,
    aiotCredFile
} AiotCredOption;

/**
 * @brief 证书信息
 */
typedef struct {
    AiotCredOption option;              /**选项*/
    uint32_t       tlsFragment;         /**分片长度,16K/4K/2K/1K*/
    char*          credFile;            /**证书内容*/
    int32_t        credLength;          /**证书长度*/
} AiotCredInfo;


/**
 * @brief 事件类型
 */
typedef enum {
    aiotConnect,                /**首次连接事件*/
    aiotReConnect,              /**重连事件*/
    aiotDisconnect,             /**断开连接事件*/
} AiotEventType;

/**
 * @brief 断开事件类型
 */
typedef enum {
    networkDisconnect,         /**网络故障而断开*/
    heartBeatTimeout,          /**心跳超时而断开*/
} AiotDisConnectEvent;

typedef struct {
    AiotEventType   type;                   /**事件类型*/
    union {
        AiotDisConnectEvent  disconnect;    /**断开连接的原因*/
    } data;
} AiotEvent;

/**
 * @brief 事件处理器
 */
typedef void (*AiotEventHandler)(void *handle, const AiotEvent* event, void *context);

/**
 * @brief 定义日志回调
 * @param[in] level     日志级别
 * @param[in] message   日志内容
 */
typedef void (*AiotLoggerCb)(AiotLoggerLevel level,char* message);

#ifdef __cplusplus
}
#endif

#endif //_INCLUDE_MQTT_PARAMS_H_
